package com.xyj.week02;

import java.util.LinkedHashMap;

/**
 * 使用LInkedHashMap来实现一个LRU算法
 */
public class T10 {
    public LinkedHashMap<Integer,Integer> cache;

    public Integer capacity;

    public T10(Integer capacity){
        this.capacity=capacity;
        cache=new LinkedHashMap<>();
    }

    /**
     * 取一个元素
     * @param key key
     * @return value
     */
    public Integer getOne(Integer key){
        if (!cache.containsValue(key)){
            return -1;
        }
        //如果这个key存在的话,将这个可以变为最常使用的。
        this.makeRecentlyKey(key);
        return cache.get(key);
    }

    /**
     * put
     */
    public void put(Integer key,Integer value){
        if (cache.containsValue(key)){
            //如果有这个key的话，修改key的值
            // 然后直接将这个元素变为最近使用的元素
            cache.put(key,value);
            this.makeRecentlyKey(key);
        return;
        }
        //如果没有这个key的话，
        //判断是否容量已满
        if (cache.size()>=this.capacity){
            //如果容量满了，先删除头部，然后重新插入
            Integer fistKey = cache.keySet().iterator().next();
            cache.remove(fistKey);
        }
        cache.put(key,value);
        capacity++;
    }

    /**
     * 将这个value变为最近使用的
     * @param key key
     */
    private void makeRecentlyKey(Integer key) {
        Integer value = cache.get(key);
        //重新插入这个key
        cache.remove(key);
        cache.put(key,value);
    }

    public static void main(String[] args) {
        T10 t10 = new T10(2);
        t10.put(1,1);
        t10.put(2,2);
        t10.put(3,3);
        System.out.println(t10.cache);
        System.out.println(t10.getOne(2));
        System.out.println(t10.cache);
    }
}
